Deno Fresh CRUD API

作成日
更新日

Fresh CRUD API

CRUD APIの作成

MDNドキュメントは、HTTPメソッドについて学ぶのに非常に役立つリソースです。ここでは、基本的なCRUD(作成、読み取り、更新、削除)APIを作成するために必要な4つの基本的なメソッドに触れます。加えて、CORSリクエストやOPTIONSメソッドがどのように関係するかも簡単に説明します。

HTTPメソッドを使用することは、REST APIを作成する一般的な方法です。Freshは、ハンドラ内で一般的なHTTPメソッドを標準でサポートしています。また、非同期HTTPリクエストもサポートされています。カスタムハンドラについては、こちらで詳しく読むことができます。

この例では、Deno KVを使用してデータベースにユーザーを保存する小さなAPIを作成します。

プロジェクトの構成は次のようになります(新規プロジェクトのFreshコードに加えて):

routes
└── api
    └── users
        ├── [id].ts
        └── index.ts

各メソッドに関するセクションでは、関連するハンドラのみが表示されます。完全なファイルは、参考のために最後に示されています。

POST

POST(create)はリソースを作成するために使用されます。

routes/api/users/index.ts
export const handler: Handlers<User | null> = {
  async POST(req, _ctx) {
    const user = (await req.json()) as User;
    const userKey = ["user", user.id];
    const ok = await kv.atomic().set(userKey, user).commit();
    if (!ok) throw new Error("Something went wrong.");
    return new Response(JSON.stringify(user));
  },
};

Postman(またはお好みのクライアント)を使って、http://localhost:8000/api/users のようなURLとPOSTメソッドでテストしてください。ペイロードは以下のようにしてください:

{
  "id": "2",
  "name": "TestUserName"
}

同じものが返ってくるはずです:

{ "id": "2", "name": "TestUserName" }

GET

GET(読み込み)はリソースを取得するために使用され、HTTPメソッドの中で最も一般的です。データベースのコンテンツ、マークダウン、静的ファイルなどを取得するためにGETを使うことができます。

routes/api/users/[id].ts
export const handler: Handlers<User | null> = {
  async GET(_req, ctx) {
    const id = ctx.params.id;
    const key = ["user", id];
    const user = (await kv.get<User>(key)).value!;
    return new Response(JSON.stringify(user));
  },
};

ユーザーを取得する練習をしてみよう!http://localhost:8000/api/users/2:

{ "id": "2", "name": "TestUserName" }

PUT(およびPATCH)

PUT(更新)とPATCHはリソースを更新するために使用されます。似てはいますが、違いがあるので、使用するケースに応じて使い分ける必要があります。MDNでHTTPメソッドについてもっと読む。

簡単に説明すると PUT はオブジェクト全体を送信する必要があり、PATCH は異なるプロパティのみを送信する必要があります。

PUTを使用した更新エンドポイントの例:

routes/api/users/[id].tsx
export const handler: Handlers<User | null> = {
  async PUT(req, ctx) {
    const id = ctx.params.id;
    const user = (await req.json()) as User;
    const userKey = ["user", id];
    const userRes = await kv.get(userKey);
    if (!userRes.value) return new Response(`no user with id ${id} found`);
    const ok = await kv.atomic().check(userRes).set(userKey, user).commit();
    if (!ok) throw new Error("Something went wrong.");
    return new Response(JSON.stringify(user));
  },
};

名前を変えてみよう。http://localhost:8000/api/users/2:

{
  "id": "2",
  "name": "New Name"
}

次を受け取ります:

{ "id": "2", "name": "New Name" }

一方、これをPATCHオペレーションとして実装することにすれば、リクエストは次のように変更されたプロパティを含むだけになる:

{
  "name": "New Name"
}

この場合 IDを送り必要はない。

DELETE

DELETE(削除)は、リソースを削除するために使用します。

routes/api/users/[id].tsx
export const handler: Handlers<User | null> = {
  async DELETE(_req, ctx) {
    const id = ctx.params.id;
    const userKey = ["user", id];
    const userRes = await kv.get(userKey);
    if (!userRes.value) return new Response(`no user with id ${id} found`);
    const ok = await kv.atomic().check(userRes).delete(userKey).commit();
    if (!ok) throw new Error("Something went wrong.");
    return new Response(`user ${id} deleted`);
  },
};

http://localhost:8000/api/users/2、本文なしでDELETEを送信してみてください。次が返されます:

user 2 deleted

オプション

オプションは、複雑なCORSユースケースのプリフライトリクエストチェックの実装など、いくつかの高度なケースに使用できます。詳細はCORSドキュメントを参照してください。 https://fresh.deno.dev/docs/examples/dealing-with-cors

メモ

Deno.openKv()がないよって言われる。

Deno KVとは https://deno.com/kv というサービスのこと。

Deno KVは、Deno.Kvネームスペースで利用可能な、Denoランタイムに直接組み込まれたキー・バリュー・データベースです。これは、多くの種類のデータストレージのユースケースに使用できますが、非常に高速な読み取りと書き込みの恩恵を受ける単純なデータ構造を格納することに優れています。Deno KVは、Deno CLIとDeno Deployで利用可能です。

https://docs.deno.com/deploy/kv/manual/

/// <reference no-default-lib="true" />main.tsから削除したらエラーは出なくなったけど、ビルドでやっぱりエラーになる。 https://github.com/denoland/deno/issues/18907

https://docs.deno.com/api/deno/~/Deno.openKv

Deno Deploy以外の環境からDeno Deploy上のリソースを使いたい場合はurlを入力する必要があります。(https://qiita.com/KokiSakano/items/6a687154c63887c45413 より)

await Deno.openKv("https://api.deno.com/databases/XXX/connect");

まだでも安定してなさそうではある。。

サイトアイコン
公開日
更新日